#ifndef DATA_DEFINE_H
#define DATA_DEFINE_H
#include <tuple>
#include <deque>
#include <opencv2/opencv.hpp>
#include "base/data_types.h"

typedef unsigned char UC;   /// 8位
typedef short    int  UC2;  /// 16

struct YZ
{
    YZ() {}
    YZ(double y,double z){
        ypp = y;
        zpp = z;
    }
    double ypp = 0;
    double zpp = 0;
};

// 一个任务的进行状态
typedef struct ProcessMessage{
    int curP;               // 当前进度
    int totalP = 1;             // 总进度
    std::string curMsg;     // 当前描述
    std::string curWarn;    // 当前警告事件
} PMsg;

struct MachineArgs
{
    MachineArgs() {}
    double u = 0;   // 地轨位置
    double r = 0;   // 变位机旋转角度
    double a = 0;   // 变位机翻转角度

    int uspeed = 100;
    int rspeed = 100;
    int aspeed = 100;

    double Su = 0;   // 安全地轨位置
    double Sr = 0;   // 安全变位机旋转角度
    double Sa = 0;   // 安全变位机翻转角度

    bool real = false;  // 是否有变位机

    std::string  toStr(){
        std::string ret = to_string(u) + "\t" + to_string(r) + "\t" + to_string(a) + "\r\n";
        ret += "安全地轨\t安全变位机旋转角度\t安全变位机翻转角度 \r\n";
        ret += to_string(Su) + "\t" +to_string(Sr) + "\t"+to_string(Sa) + "\r\n";
        return  ret;
    }
};

struct DBIndex{
    std::string db_name;
    int seamid;
    int index1;

    void  print(){
        std::cout << "db_name:"<<db_name<<std::endl;
        std::cout << "seamid:"<<seamid<<std::endl;
        std::cout << "index1:"<<index1<<std::endl;
    }

    std::string  toStr(){
        std::string ret = db_name + "\t" + to_string(seamid)  + "\t" + to_string(index1) ;
        return  ret;
    }
};

// 生成的抖动矩阵单元，此处的pos代表TCP为CAMERA的点
typedef std::tuple<RobotPos,YZ> GenPos;     // 0.原始数据点   1.YZ偏移值

// 一个龙骨数据产生的抖动矩阵
/*
    * 0.变位机参数  1.原始数据点  2.矩阵格点 3.是否数据库中的
    * 4.所在数据库的索引   5.旋转矩阵(dx,dy,dz,rz,ry,rx)
*/
typedef std::tuple<MachineArgs,RobotPos,std::vector<GenPos> ,bool,DBIndex,RobotPos> GenPosVector;



// 运行后生成的数据
typedef std::tuple<cv::Mat,GenPos,int,std::string> Gen_Run;     /// 0.图像  1.Pos  1.2.YZ  2.序号  3.posStr


/// 参数说明:1.任务编号   2.序号  3.I W U 6.时间
typedef  std::tuple<std::string ,int,double,double,double,std::string> TaskDetail;      /// 任务清单

#endif // DATA_DEFINE_H
